/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.documentar.util;

import br.com.documentar.model.AcessoColaboradorModel;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Frame;
import java.awt.Window;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JViewport;

/**
 *
 * @author Santos
 */
public final class UtilitariosCampos {

    /**
     * Constantes com os tamanhos das colunas do tableModel
     */
    public static final int COLUNA_CODIGO_SIZE = 100;
    public static final int COLUNA_PRODUTO_SIZE = 200;
    public static final int COLUNA_VERSAO_SIZE = 200;
    public static final int COLUNA_CATEGORIA_SIZE = 600;
    public static final int COLUNA_TELA_SIZE = 600;
    public static final int COLUNA_DOCUMENTO_SIZE = 200;
    public static final int COLUNA_ABA_SIZE = 200;
    public static final int COLUNA_POSICAO_SIZE = 70;
    public static final int COLUNA_NOME_CAMPO_SIZE = 270;
    public static final int COLUNA_FUNCAO_PARAMETRO_SIZE = 300;
    public static final int COLUNA_EXEMPLO_SIZE = 300;
    public static final int COLUNA_IMAGEM_TELA_SIZE = 300;
    public static final int COLUNA_ANEXO_SIZE = 300;
    public static final int COLUNA_LINK_SIZE = 300;
    public static final int COLUNA_TABELA_SIZE = 500;
    public static final int COLUNA_TABELA_NOME_AMIGAVEL_SIZE = 300;
    public static final int COLUNA_TIPO_BANCO_SIZE = 300;
    public static final int COLUNA_NOME_BANCO_SIZE = 300;
    public static final int COLUNA_ACAO_TABELA_SIZE = 300;
    public static final int COLUNA_TABLESPACE_SIZE = 300;
    public static final int COLUNA_DONO_TABELA_SIZE = 300;
    public static final int COLUNA_COLUNA_SIZE = 300;
    public static final int COLUNA_COLUNA_NOME_AMIGAVEL_SIZE = 300;
    public static final int COLUNA_ACAO_COLUNA_SIZE = 300;
    public static final int COLUNA_TIPO_DADO_COLUNA_SIZE = 300;
    public static final int COLUNA_TAMANHO_COLUNA_SIZE = 300;
    public static final int COLUNA_ACEITA_NULL_COLUNA_SIZE = 300;
    public static final int COLUNA_NOME_SIZE = 200;
    public static final int COLUNA_CONTATO_SIZE = 200;
    public static final int COLUNA_ATIVO_SIZE = 100;
    public static final int COLUNA_REVENDA_SIZE = 200;
    public static final int COLUNA_CLIENTE_SIZE = 200;
    public static final int COLUNA_NOME_RAZAO_SOCIAL_SIZE = 300;
    public static final int COLUNA_NOME_FANTASIA_SIZE = 300;
    public static final int COLUNA_NUMERO_DOCUMENTO_SIZE = 150;
    public static final int COLUNA_EMAIL_SIZE = 300;
    public static final int COLUNA_TELEFONE_SIZE = 150;
    public static final int COLUNA_UNIDADE_NEGOCIO_SIZE = 150;
    public static final int COLUNA_COLABORADOR_SIZE = 300;
    public static final int COLUNA_DATA_SIZE = 120;
    public static final int COLUNA_OBSERVACAO_SIZE = 300;
    public static final int COLUNA_REMOTA_LOCAL_SIZE = 100;
    public static final int COLUNA_MOTIVO_SIZE = 200;
    public static final int COLUNA_SIGLA_SIZE = 200;
    public static final int COLUNA_ENDERECO_SIZE = 300;
    public static final int COLUNA_COMPLEMENTO_ENDERECO_SIZE = 300;
    public static final int COLUNA_BAIRRO_SIZE = 200;
    public static final int COLUNA_CEP_SIZE = 100;
    public static final int COLUNA_CIDADE_SIZE = 200;
    public static final int COLUNA_ESTADO_SIZE = 200;
    public static final int COLUNA_UF_SIZE = 30;
    public static final int COLUNA_PAIS_SIZE = 200;
    public static final int COLUNA_OBJETO_SIZE = 200;
    public static final int COLUNA_OBJETO_NOME_AMIGAVEL_SIZE = 200;
    public static final int COLUNA_TEMPORARIA_SIZE = 100;

    /**
     * Usuário/Colaborador que está logado no sistema
     */
    public static int usuario;
    
    private Container componente;

    public Container getComponente() {
        return componente;
    }

    public void setComponente(Container componente) {
        this.componente = componente;
    }

    public static void setUsuario(int usuario) {
        UtilitariosCampos.usuario = usuario;
    }

    /**
     * Usuário/Colaborador que está logado no sistema
     *
     * @return
     */
    public static int getUsuario() {
        return usuario;
    }

    /**
     * Construtor da classe
     *
     * @param componente Qualquer tipo de componente gráfico
     */
    public UtilitariosCampos(Container componente) {
        this.setComponente(componente);
    }

    /**
     * Metodo resposável por limpar os dados dos campos do formulario. Quaisquer
     * tipo de dado, a medida que surge a necessidade nesse metodo são
     * implementados novos tipos de componentes, os quais ficam submetidos a
     * ação desse metodo. Funciona da seguinte mandeira. É passado um jPanel, o
     * qual sobre si tem vários compoente, esses componentes são colocados em um
     * vetor. A cada condicional nesse metodo é verificado se existe tal tipo de
     * objeto, é feito o casting e manipula-se a referencia da memoria do objeto
     * que reflete na tela do usuario
     *
     * @param conjuntoComponente componente qualquer de objetos gráficos,
     * jpanel, frame, jscrollpane
     */
    public static void getLimpezaCampos(Container conjuntoComponente) {
        //otimizar metodo implementando recursividade, pois e ideia é passar o 
        //form ou painel e o programa se encarregar de limpar tudo para o usuário
        Component components[] = conjuntoComponente.getComponents();
        for (Component campo : components) {
            if (campo instanceof JFormattedTextField) {
                JFormattedTextField fField = (JFormattedTextField) campo;
                fField.setText("");
            } else if (campo instanceof JTextField) {
                JTextField field = (JTextField) campo;
                field.setText("");
            } else if (campo instanceof JComboBox) {
                JComboBox comboBox = (JComboBox) campo;
                comboBox.setSelectedItem("ESCOLHER");
            } else if (campo instanceof JCheckBox) {
                JCheckBox checkBox = (JCheckBox) campo;
                checkBox.setSelected(false);
            } else if (campo instanceof JTextArea) {
                JTextArea textArea = (JTextArea) campo;
                textArea.setText("");
                //chamar função recursiva
            } else if (campo instanceof JPanel) {
                JPanel panel = (JPanel) campo;
                getLimpezaCampos(panel);
            } else if (campo instanceof JScrollPane) {
                JScrollPane scrollPane = (JScrollPane) campo;
                getLimpezaCampos(scrollPane);
            } else if (campo instanceof JTabbedPane) {
                JTabbedPane tabbedPane = (JTabbedPane) campo;
                getLimpezaCampos(tabbedPane);
            } else if (campo instanceof JViewport) {
                JViewport viewPort = (JViewport) campo;
                getLimpezaCampos(viewPort);
            } else if (campo instanceof JScrollBar) {
                JScrollBar scrollBar = (JScrollBar) campo;
                getLimpezaCampos(scrollBar);
            }
        }
    }

    /**
     * Metodo responsável por valor a integradade dos campos
     *
     * @param conjuntoComponente componente qualquer de objetos gráficos,
     * jpanel, frame, jscrollpane
     * @return true -> campo ok, false -> campo com pendência
     */
    public static boolean getValidarCampos(Container conjuntoComponente) {
        Component components[] = conjuntoComponente.getComponents();
        int ocorrencia = 0;
        for (Component campo : components) {
            if (campo instanceof JFormattedTextField) {
                JFormattedTextField fField = (JFormattedTextField) campo;
                if (fField.getText().equals("    -  -  ")
                        && fField.isEnabled() == true) {
                    fField.requestFocus();
                    fField.setBackground(Color.red);
                    ocorrencia++;
                } else {
                    fField.setBackground(Color.white);
                }
            } else if (campo instanceof JTextField) {
                JTextField field = (JTextField) campo;
                if (field.getText().equals("")
                        && field.isEnabled() == true) {
                    field.requestFocus();
                    field.setBackground(Color.red);
                    ocorrencia++;
                } else {
                    field.setBackground(Color.WHITE);
                }
            } else if (campo instanceof JComboBox) {
                JComboBox comboBox = (JComboBox) campo;
                if (comboBox.getSelectedItem().toString().equals("ESCOLHER")) {
                    comboBox.requestFocus();
                    comboBox.setBackground(Color.red);
                    ocorrencia++;
                } else {
                    comboBox.setBackground(Color.white);
                }
            } else if (campo instanceof JTextArea) {
                JTextArea textArea = (JTextArea) campo;
                if (textArea.getText().equals("")
                        && textArea.isEnabled() == true) {
                    textArea.requestFocus();
                    textArea.setBackground(Color.red);
                    ocorrencia++;
                } else {
                    textArea.setBackground(Color.white);
                }
                //chamar função recursiva
            } else if (campo instanceof JPanel) {
                JPanel panel = (JPanel) campo;
                if (!getValidarCampos(panel)) {
                    ocorrencia++;
                }
            } else if (campo instanceof JScrollPane) {
                JScrollPane scrollPane = (JScrollPane) campo;
                if (!getValidarCampos(scrollPane)) {
                    ocorrencia++;
                }
            } else if (campo instanceof JTabbedPane) {
                JTabbedPane tabbedPane = (JTabbedPane) campo;
                if (!getValidarCampos(tabbedPane)) {
                    ocorrencia++;
                }
            } else if (campo instanceof JViewport) {
                JViewport viewPort = (JViewport) campo;
                if (!getValidarCampos(viewPort)) {
                    ocorrencia++;
                }
            } else if (campo instanceof JScrollBar) {
                JScrollBar scrollBar = (JScrollBar) campo;
                if (!getValidarCampos(scrollBar)) {
                    ocorrencia++;
                }
            }
        }
        return ocorrencia <= 0;
    }

    /**
     * Metodo generico para extrair o valor inteiro do objeto jCcmboBox. Sendo
     * que o separador é o " - "
     *
     * @param jComboBox Objeto comboBox
     * @return
     *
     */
    public static int getIntegerComboBox(JComboBox jComboBox) {
        String[] aux = jComboBox.getSelectedItem().toString().split(" - ");
        //verificar se é raiz "0 - RAIZ"
        if (aux[0].equals("0")) {
            return 0;
        } else {
            return Integer.parseInt(aux[0]);
        }
    }

    /**
     * Metodo generico para extrair o valor inteiro dos campos de textField,
     * poupando vários códigos de casting na aplicação
     *
     * @param jTextField Text
     * @return numero inteiro ou 0, caso seja passado null
     */
    public static int getIntegerText(JTextField jTextField) {
        int numero;
        try {
            numero = Integer.parseInt(jTextField.getText());
        } catch (NumberFormatException e) {
            return 0;
        }
        return numero;
    }

    /**
     * Metodo generico para extrair o valor double dos campos de textField,
     * poupando vários códigos de casting na aplicação
     *
     * @param jTextField Text
     * @return
     */
    public static double getDoubleText(JTextField jTextField) {
        return Double.valueOf(jTextField.getText());
    }

    /**
     * Metodo generico para extrair o valor double dos campos de textField,
     * poupando vários códigos de casting na aplicação
     *
     * @param valor
     * @return
     */
    public static String getDoubleText(double valor) {
        return String.valueOf(valor);
    }

    /**
     * Metodo generico para extrair o valor inteiro dos campos de textField,
     * poupando vários códigos de casting na aplicação
     *
     * @param valor valor inteiro
     * @return
     */
    public static String getIntegerText(int valor) {
        return String.valueOf(valor);
    }

    /**
     * Metodo generico para extrair o valor inteiro dos JTable, tudo que estive
     * sendo separado por " - "
     *
     * @param jTable objeto jTable
     * @param coluna coluna que está o valor
     * @return
     */
    public static int getIntegerTable(JTable jTable, int coluna) {
        String[] aux = jTable.getValueAt(jTable.getSelectedRow(), coluna).toString().split(" - ");
        return Integer.parseInt(aux[0]);
    }

    /**
     * Metodo generico para extrair a resposta do ComboBox separado por " - "
     *
     * @param jComboBox
     * @return
     */
    public static char getRespostaComboBox(JComboBox jComboBox) {
        String[] aux = jComboBox.getSelectedItem().toString().split(" - ");
        return aux[0].charAt(0);
    }

    /**
     * Metodo generico responsável por selecionar o item de resposta do objeto.
     * Disponível apenas para perguntas e resposta S - Sim ou N - Não
     *
     * @param jcomboBox objeto combobox
     * @param resposta variável com a resposta
     */
    public static void setRespostaComboBox(JComboBox jcomboBox, char resposta) {
        jcomboBox.setSelectedItem(resposta == 'S' ? "S - Sim" : "N - Não");
    }

    /**
     * Metodo responsável por validar o acesso dos usuários no sistema
     *
     * @param conjuntoComponente MenuBar
     * @param listaAcessoColaborador lista de acesso do colaborador
     */
    public static void validarAcessoUsuario(Container conjuntoComponente, List<AcessoColaboradorModel> listaAcessoColaborador) {
        Component components[] = conjuntoComponente.getComponents();
        for (Component campo : components) {
            //verificar se tem jMenu
            if (campo instanceof JMenu) {
                JMenu getMenuRaiz = (JMenu) campo;
                Component componentsMenuItem[] = getMenuRaiz.getMenuComponents();
                for (Component itemMenu : componentsMenuItem) {
                    if (itemMenu instanceof JMenuItem) {
                        JMenuItem getItemMenu = (JMenuItem) itemMenu;
                        //Descomente a linha abaixo para descobrir o que está faltando
                        //System.out.println(getItemMenu.getName());
                        for (AcessoColaboradorModel modelAcessoColaborador : listaAcessoColaborador) {
                            if (modelAcessoColaborador.getJanela().getNome().equals(getItemMenu.getName())) {
                                getItemMenu.setEnabled(true);
                                break;
                            } else {
                                getItemMenu.setEnabled(false);
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * Metodo responsável por capturar todos as janelas que estão abertas da
     * minha aplicação e retorna em uma lista
     *
     * @return Todos os frames visiveis do programa
     */
    public static List<Frame> getFrames() {
        //captura todas as janelas aberta da aplicação em memoria
        Window[] allWindows = Window.getWindows();
        //cria uma lista de Frame
        List<Frame> listaJanela = new ArrayList<>();
        for (Window janela : allWindows) {
            if (janela instanceof Frame && janela.isVisible()) {
                //adiciona todos os frames na lista
                listaJanela.add((Frame) janela);
            }
        }
        return listaJanela;
    }

    /**
     * Metodo responsável por fechar todas as janelas do programa quando
     * solicitado
     */
    public static void fecharTodasJanelas() {
        for (Frame janela : getFrames()) {
            janela.dispose();
        }
    }

    /**
     * Implementar processo que irá gravar a atividade do usuário no sistema
     * TCOL_COLABORADOR_AUDITORIA
     *
     * @param colaborador codigo do colaborador
     * @param janela codigo da janela da operação
     * @param acao acao do usuário. C - Consulta, I - Insert, U - Update, D -
     * Delete
     * @param detalhes detalhes do que ocorreu
     * @param script script executado pelo sistema
     *
     * @return true - operação executada com sucesso, false - falha na operação
     */
    public static boolean gravarAtividadeUsuario(int colaborador, int janela, char acao, String detalhes, String script) {

        return true;
    }

    /**
     * Metodo generico responsável por definir o tamanho das colunas dos jTable
     *
     * @param jTable objeto table
     * @param posicao posicao da coluna
     * @param tamanho tamanho a ser aplicado
     */
    public static void setTamanhoColunaTable(JTable jTable, int posicao, int tamanho) {
        jTable.getColumnModel().getColumn(posicao).setMinWidth(30);//FIXO tamanho minimo
        jTable.getColumnModel().getColumn(posicao).setPreferredWidth(tamanho);//tamanho padrão
        jTable.getColumnModel().getColumn(posicao).setMaxWidth(999);//FIXO tamanho maximo
    }

    /**
     * Metodo generico responsável por receber um objeto jTextField e retornar a
     * string que o mesmo contem
     *
     * @param textField
     * @return
     */
    public static String getTextField(JTextField textField) {
        return textField.getText().toString();
    }

    /**
     * Metodo generico responsável por validar o email atraves de expressão
     * regular
     *
     * @param email email a ser validado
     * @return true ou false
     */
    public static boolean getValidarEmail(String email) {
        String expressaoRegular = "^[\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+[a-zA-Z]{2,3}$";
        return email.matches(expressaoRegular);
    }

    /**
     * Metodo responsável por habilitar e desabilitar recursos do formulario na
     * manipulação dos dados
     *
     * @param conjuntoComponente
     * @param acaoBotao ação executada pelo botão. Novo, Editar, Excluir,
     * Consultar
     */
    public static void getRegraBotao(Container conjuntoComponente, String acaoBotao) {

        Component components[] = conjuntoComponente.getComponents();
        for (Component campo : components) {
            if (campo instanceof JFormattedTextField) {
                JFormattedTextField fField = (JFormattedTextField) campo;
                if (fField.getText().equals("    -  -  ")
                        && fField.isEnabled() == true) {
                    fField.requestFocus();
                    fField.setBackground(Color.red);

                } else {
                    fField.setBackground(Color.white);
                }
            } else if (campo instanceof JTextField) {
                JTextField field = (JTextField) campo;
                if (field.getText().equals("")
                        && field.isEnabled() == true) {
                    field.requestFocus();
                    field.setBackground(Color.red);

                } else {
                    field.setBackground(Color.WHITE);
                }
            } else if (campo instanceof JComboBox) {
                JComboBox comboBox = (JComboBox) campo;
                if (comboBox.getSelectedItem().toString().equals("ESCOLHER")) {
                    comboBox.requestFocus();
                    comboBox.setBackground(Color.red);

                } else {
                    comboBox.setBackground(Color.white);
                }
            } else if (campo instanceof JTextArea) {
                JTextArea textArea = (JTextArea) campo;
                if (textArea.getText().equals("")) {
                    textArea.requestFocus();
                    textArea.setBackground(Color.red);

                } else {
                    textArea.setBackground(Color.white);
                }
                //chamar função recursiva
            } else if (campo instanceof JPanel) {
                JPanel panel = (JPanel) campo;
                if (!getValidarCampos(panel)) {

                }
            } else if (campo instanceof JScrollPane) {
                JScrollPane scrollPane = (JScrollPane) campo;
                if (!getValidarCampos(scrollPane)) {

                }
            } else if (campo instanceof JTabbedPane) {
                JTabbedPane tabbedPane = (JTabbedPane) campo;
                if (!getValidarCampos(tabbedPane)) {

                }
            } else if (campo instanceof JViewport) {
                JViewport viewPort = (JViewport) campo;
                if (!getValidarCampos(viewPort)) {

                }
            } else if (campo instanceof JScrollBar) {
                JScrollBar scrollBar = (JScrollBar) campo;
                if (!getValidarCampos(scrollBar)) {

                }
            }
        }
    }

    /**
     * Metodo responsável por validar a data que o usuário informou
     *
     * @param date data do calendário
     * @return true, formato correto, false, formato incorreto
     */
    public static boolean getValidarData(String date) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        df.setLenient(false);
        try {
            df.parse(date);
            return true;
        } catch (ParseException ex) {
            ex.getStackTrace();
            return false;
        }
    }

}
